home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / gnu / smlltalk / smtk_11.zoo / Collection.st < prev    next >
Text File  |  1990-05-26  |  7KB  |  263 lines

  1. "======================================================================
  2. |
  3. |   Collection Method Definitions
  4. |
  5.  ======================================================================"
  6.  
  7.  
  8. "======================================================================
  9. |
  10. | Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc.
  11. | Written by Steve Byrne.
  12. |
  13. | This file is part of GNU Smalltalk.
  14. |
  15. | GNU Smalltalk is free software; you can redistribute it and/or modify it
  16. | under the terms of the GNU General Public License as published by the Free
  17. | Software Foundation; either version 1, or (at your option) any later version.
  18. | GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT
  19. | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  20. | FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
  21. | details.
  22. | You should have received a copy of the GNU General Public License along with
  23. | GNU Smalltalk; see the file COPYING.  If not, write to the Free Software
  24. | Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  
  25. |
  26.  ======================================================================"
  27.  
  28.  
  29. "
  30. |     Change Log
  31. | ============================================================================
  32. | Author       Date       Change 
  33. | sbyrne     25 Apr 89      created.
  34. |
  35. "
  36.  
  37. Object subclass: #Collection
  38.        instanceVariableNames: ''
  39.        classVariableNames: ''
  40.        poolDictionaries: ''
  41.        category: nil.
  42.  
  43. Collection comment: 
  44. 'I am an abstract class.  My instances are collections of objects.  My
  45. subclasses may place some restrictions or add some definitions to how
  46. the objects are stored or organized; I say nothing about this.  I merely
  47. provide some object creation and access routines for general collections
  48. of objects.' !
  49.  
  50.  
  51. !Collection class methodsFor: 'instance creation'!
  52.  
  53. with: anObject
  54.     ^self new add: anObject; yourself
  55. !
  56.  
  57. with: firstObject with: secondObject
  58.     ^self new add: firstObject; add: secondObject; yourself
  59. !
  60.  
  61. with: firstObject with: secondObject with: thirdObject
  62.     ^self new add: firstObject; add: secondObject; add: thirdObject; yourself
  63. !
  64.  
  65. with: firstObject with: secondObject with: thirdObject with: fourthObject
  66.     ^self new add: firstObject; add: secondObject; add: thirdObject;
  67.         add: fourthObject; yourself
  68. !!
  69.  
  70.  
  71.  
  72. !Collection methodsFor: 'Adding to a collection'!
  73.  
  74. add: newObject
  75.     self subclassResponsibility
  76. !
  77.  
  78. addAll: aCollection
  79.     aCollection do: [ :element | self add: element ].
  80.     ^aCollection
  81. !!
  82.  
  83.  
  84.  
  85. !Collection methodsFor: 'Removing from a collection'!
  86.  
  87. remove: oldObject ifAbsent: anExceptionBlock
  88.     self subclassResponsibility
  89. !
  90.  
  91. remove: oldObject
  92.     self remove: oldObject
  93.          ifAbsent: [ ^self error: 'Failed to remove object' ].
  94.     ^oldObject
  95. !
  96.  
  97. removeAll: aCollection
  98.     " ??? we're supposed to report an error if an object can't be removed
  99.       properly.  I've elected to let remove: report the error.  Also, it's
  100.       not clear whether we're supposed to remove all occurrences of the
  101.       members of aCollection from the receiver, or only the first."
  102.     aCollection do: [ :element | self remove: element ].
  103.     ^aCollection
  104. !!
  105.  
  106.  
  107.  
  108. !Collection methodsFor: 'testing collections'!
  109.  
  110. includes: anObject
  111.     self do: [ :element | anObject = element ifTrue: [ ^true ] ].
  112.     ^false
  113. !
  114.  
  115. isEmpty
  116.     ^self size == 0
  117. !
  118.  
  119. occurrencesOf: anObject
  120.     | count |
  121.     count _ 0.
  122.     self do: [ :element | anObject == element ifTrue: [ count _ count + 1 ] ].
  123.     ^count
  124. !
  125.  
  126. size
  127.     | count |
  128.     count _ 0.
  129.     self do: [ :element | count _ count + 1].
  130.     ^count
  131. !!
  132.  
  133.  
  134.  
  135. !Collection methodsFor: 'enumerating the elements of a collection'!
  136.  
  137. do: aBlock
  138.     self subclassResponsibility
  139. !
  140.  
  141. select: aBlock
  142.     | newCollection |
  143.     " ### I don't know if this is the right way to create a new collection
  144.       in all cases...I suspect that it is not..."
  145.     newCollection _ self species new.
  146.     self do: [ :element | (aBlock value: element)
  147.                             ifTrue: [ newCollection add: element ]
  148.          ].
  149.     ^newCollection
  150. !
  151.  
  152. reject: aBlock
  153.     | newCollection |
  154.     " ### I don't know if this is the right way to create a new collection
  155.       in all cases...I suspect that it is not..."
  156.     newCollection _ self species new.
  157.     self do: [ :element | (aBlock value: element)
  158.                             ifFalse: [ newCollection add: element ]
  159.          ].
  160.     ^newCollection
  161. !
  162.  
  163. collect: aBlock
  164.     | newCollection |
  165.     " ### I don't know if this is the right way to create a new collection
  166.       in all cases...I suspect that it is not..."
  167.     newCollection _ self species new.
  168.     self do: [ :element | newCollection add: (aBlock value: element) ].
  169.     ^newCollection
  170. !
  171.  
  172. detect: aBlock ifNone: exceptionBlock
  173.     self do: [ :element | (aBlock value: element) ifTrue: [ ^element ] ].
  174.     exceptionBlock value    
  175. !
  176.     
  177. detect: aBlock
  178.     self detect: aBlock ifNone: [ ^self error: 'Collection detect: failed']
  179. !
  180.  
  181. inject: thisValue into: binaryBlock
  182.     self do: [ :element | thisValue _ binaryBlock value: thisValue
  183.                                                   value: element ].
  184.     ^thisValue
  185. !!
  186.  
  187.  
  188.  
  189. !Collection methodsFor: 'converting'!
  190.  
  191. asBag
  192.     | aBag |
  193.     aBag _ Bag new.
  194.     self do: [ :element | aBag add: element ].
  195.     ^aBag
  196. !
  197.  
  198. asSet
  199.     | aSet |
  200.     aSet _ Set new: self size.
  201.     self do: [ :element | aSet add: element ].
  202.     ^aSet
  203. !
  204.  
  205. asOrderedCollection
  206.     | anOrderedCollection |
  207.     anOrderedCollection _ OrderedCollection new: self size.
  208.     self do: [ :element | anOrderedCollection add: element ].
  209.     ^anOrderedCollection
  210. !
  211.  
  212. asSortedCollection
  213.     | aSortedCollection |
  214.     aSortedCollection _ SortedCollection new.
  215.     self do: [ :element | aSortedCollection add: element ].
  216.     ^aSortedCollection
  217. !
  218.  
  219. asSortedCollection: aBlock
  220.     | aSortedCollection |
  221.     aSortedCollection _ SortedCollection sortBlock: aBlock.
  222.     self do: [ :element | aSortedCollection add: element ].
  223.     ^aSortedCollection
  224. !!
  225.  
  226.  
  227.  
  228. !Collection methodsFor: 'printing'!
  229.  
  230. printOn: aStream
  231.     | firstTime |
  232.     firstTime _ true.
  233.     aStream nextPutAll: self classNameString.
  234.     aStream nextPutAll: ' ('.
  235.     self do:
  236.         [ :element | firstTime ifTrue: [ firstTime _ false ]
  237.                            ifFalse: [ aStream nextPut: Character space ].
  238.               element storeOn: aStream ].
  239.     aStream nextPut: $)
  240. !!
  241.  
  242.  
  243.  
  244. !Collection methodsFor: 'storing'!
  245.  
  246. store: aStream
  247.     | noElements |
  248.     aStream nextPut: $(.
  249.     aStream nextPutAll: self classNameString.
  250.     aStream nextPutAll: ' new'.
  251.     noElements _ true.
  252.     self do:
  253.         [ :element | aStream nextPutAll: ' add: '.
  254.                      element storeOn: aStream.
  255.              aStream nextPut: $;.
  256.              noElements _ false ].
  257.     noElements ifFalse: [ aStream nextPutAll: ' yourself' ].
  258.     aStream nextPut: $)
  259. !!
  260.  
  261.